import axios from 'axios'
import router from '../router'
import { ElMessage } from 'element-plus'

/**
 * 创建axios实例
 * 用于统一管理HTTP请求的配置和拦截处理
 */
const service = axios.create({
    // 基础URL配置：优先使用环境变量，否则使用相对路径
    baseURL: import.meta.env.VITE_API_URL || '/api',
    // 请求超时时间：5秒
    timeout: 5000,
    // 默认请求头配置
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
})

/**
 * 请求拦截器
 * 在请求发送前进行统一处理
 */
service.interceptors.request.use(
    // 成功拦截：配置请求参数
    config => {
        // 从本地存储获取用户token
        const token = localStorage.getItem('token')
        // 如果存在token，添加到请求头用于身份验证
        if (token) {
            config.headers.Authorization = token
        }
        // 返回配置后的请求对象
        return config
    },
    // 失败拦截：处理请求配置错误
    error => {
        ElMessage.error('请求参数错误')
        return Promise.reject(error)
    }
)

/**
 * 响应拦截器
 * 在接收到响应后进行统一处理
 */
service.interceptors.response.use(
    // 成功拦截：处理正常响应
    response => {
        // 解构响应对象：状态码和响应数据
        const { status, data } = response

        // 第一步：检查HTTP状态码
        if (status !== 200) {
            ElMessage.error('访问服务器出现异常')
            return Promise.reject(new Error('网络异常'))
        }

        // 第二步：检查业务状态码
        // 解构响应数据：业务状态码、实际数据、提示信息
        const { code, data: result, msg } = data

        // 根据业务状态码进行不同处理
        switch (code) {
            case 200:
                // 请求成功：显示成功提示（如果有提示信息）
                if (msg) {
                    ElMessage({
                        message: msg,
                        type: 'success'
                    })
                }
                // 返回实际业务数据
                return result

            case 401:
                // 未授权：token过期或无效
                const message = msg || '认证失败,稍后跳转到登录页面'
                ElMessage({
                    message: message,
                    type: 'warning'
                })
                // 清除本地token
                localStorage.removeItem('token')
                // 延迟跳转到登录页面
                setTimeout(() => {
                    router.push('/login')
                }, 1800)
                return Promise.reject(new Error('未授权'))

            default:
                // 其他错误：显示错误提示
                if (msg) {
                    ElMessage(msg)
                }
                return Promise.reject(new Error(msg || '操作失败'))
        }
    },
    // 失败拦截：处理网络错误、服务器错误等
    error => {
        ElMessage.error('系统出现异常,请联系管理员')
        return Promise.reject(error)
    }
)

// 导出配置好的axios实例，供全局使用
export default service
